//----------------------搭建服务器-------------------------------------
//引入express
const express = require("express");
//实例化服务器
let app = express();
//引入formData解析器
const multiparty = require("multiparty");
//引入文件读取fs
const  fs = require('fs')
const path = require('path')
let bodyparser = require("body-parser");
//托管静态文件夹
app.use("/uploads", express.static("./uploads"));
const { users } = require("./models/users");
const { cars } = require("./models/cars");
const { orders } = require("./models/orders");
const { brands } = require("./models/brands");

// //配置解析post的请求参数 json格式
app.use(bodyparser.urlencoded({ extended: true }));
app.use(bodyparser.json());

const baseUrl = "http://127.0.0.1:9000";
// 设置响应头，解决跨域问题
const cors = require("cors");
// 开发环境设置，生产环境需要配置安全的参数
app.use(cors());
// 设置关联

users.belongsTo(orders, { foreignKey: "id", targetKey: "userId" });
orders.belongsTo(users, { foreignKey: "userId", targetKey: "id" });
orders.belongsTo(cars, { foreignKey: "carId", targetKey: "id" });
cars.belongsTo(orders, { foreignKey: "id",targetKey: "carId" });
cars.belongsTo(brands, { foreignKey: "brandId" });
// brands.belongsTo(cars,{foreignKey:'id'});


// get查询-----------------------------------------------------------------------------
// 获取全部普通用户数据
app.get("/", (req, res) => {
  res.send("ok");
});
app.all("*", (req, res, next) => {
  console.log(`${req.params[0]} - 提交参数：`, req.body);
  next();
});

app.get("/users",(req,res)=>{
    users.
    findAll({
        include:[orders]
    }).then(val=>{
        res.send({
            message:'获取成功',
            code:200,
                data:val
        }) 
    })
})
app.get("/cars",(req,res)=>{
    cars.
    findAll({
        include:[brands],
    }).then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/orders",(req,res)=>{
    orders.
    findAll({
        include:[{model:cars},{model:users}]
    }).then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/brands",(req,res)=>{
    brands.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})

// post查询-----------------------------------------------------------------------------
// 查询相关品牌的汽车
app.post("/cars",(req,res)=>{
    cars.
    findAll({
        where:{
            brandId:req.body.brandId
        },
    }).then(val=>{
        res.send({
            message:'查询成功',
            code:200,
            data:val
        }) 
    }).catch(err=>{
        res.send({
            code:500,
            message:`执行失败，错误信息：${err}`,
        })
    })
})
// 查询一名用户再带出他的所有订单
app.post("/orders",(req,res)=>{
    orders
    .findAll({
        where: { userId: req.body.id },
        include:[cars],
    }).then( val => {
        res.send({
            code: 200,
            message: "查询成功",
            orderData: val,
        });
    }).catch(err=>{
        res.send({
            code:500,
            message:`执行失败，错误信息：${err}`,
        })
    })
})
// 用户登录
app.post("/users/login",(req,res)=>{
    console.log(req.body);
    users.findOne({
        where:{ 
            user:req.body.user
            }
        }).then(val =>{ 
              //先判定一下该用户是否已被注册
            if (val == null || val == undefined) {
                res.send({ 
                    code:404, 
                    message:`用户 ${req.body.user} 不存在！`,
                })
            } 
            else{
                 
                // 如果没有则正常注册
                if (val.password == req.body.password) {
                    res.send({
                        code:200,
                        message:`登录成功~`,
                        data:val
                    })
                }else{
                    res.send({
                        code:402,
                        message:`密码无效`,
                    })
                }
            }
        })
})

// --------------------------------------------------------------插入
//新增用户信息（注册版） 
app.post("/users/register", (req,res)=>{
    users.findOne({
        where:{
            user:req.body.user
            }
        }).then(val =>{
            //先判定一下该用户是否已被注册
            if (val != null) {
                res.send({
                    code:400,
                    message:`注册失败，用户 ${val.user} 已存在！`,
                })
            } else{
                // 如果没有则正常注册
                req.body.id = require("node-uuid")().replace(/-/g, "").slice(0, 9); // 去除横线-
                req.body.username = req.body.username || req.body.user
                users.
                create(req.body).then(val1=>{
                    res.send({ 
                        code:200,
                        message:`用户${val1.username}注册成功！`,
                        //返回用户信息
                        data:val1
                    })
                }).catch( err =>{
                    res.send({
                        code:400,
                        message:`注册失败，错误信息:${err}`,
                    })
                })//注册
            
            }
    }) //查找用户
})
// 新增车辆
app.post("/cars/insert", async (req,res)=>{
    cars
    .create(req.body).then(data=>{
        res.send({
            code:200,
            message:`添加成功`,
            data
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
 
})
// 新增订单
app.post("/orders/insert", async (req,res)=>{
    req.body.id = '00' + require("node-uuid")().replace(/-/g, "").slice(0, 6) + new Date().getDay() + new Date().getMilliseconds(); // 去除横线- 
    orders
    .create(req.body).then(data=>{
        res.send({
            code:200,
            message:`订单创建成功`,
            data
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
 
})
// 新增品牌
app.post("/brands/insert", async (req,res)=>{
    brands
    .create(req.body).then(data=>{
        res.send({
            code:200,
            message:`添加成功`,
            data
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
 
})
// --------------------------------------------------------------删除
//删除车辆
app.post("/cars/delete",(req,res)=>{
    cars.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 //删除用户
app.post("/users/delete",(req,res)=>{
    users.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
//删除品牌
app.post("/brands/delete",(req,res)=>{
    brands.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 //删除订单
app.post("/orders/delete",(req,res)=>{
    orders.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// --------------------------------------------------------------更新
 //更新用户信息
 app.post("/users/update",(req,res)=>{
    delete req.body.createdAt
    users.
    update(req.body,{
        where:{
            id:req.body.id
        }
    }).then(f=>{
        if (f) {
            users.findOne({
                where:{
                    id:req.body.id
                }
            }).then(val=>{
                res.send({
                    message:`更新成功`,
                    code:200,
                    data:val
                })
            })
        }else{
            res.send({
                code:500,
                message:`更新失败`,
            })
        }
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 //更新车辆信息
 app.post("/cars/update",(req,res)=>{
    delete req.body.createdAt
    cars.
    update(req.body,{
        where:{
            id:req.body.id
        }
    }).then(f=>{
        if (f) {
            cars.findOne({
                where:{
                    id:req.body.id
                }
            }).then(data=>{
                res.send({
                    message:`更新成功`,
                    code:200,
                    data
                })
            })
        }else{
            res.send({
                code:400,
                message:`更新失败`,
            })
        }
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 //更新订单状态信息
 app.post("/orders/update",(req,res)=>{
    delete req.body.createdAt
    orders.
    update(req.body,{
        where:{
            id:req.body.id
        }
    }).then(f=>{
        if (f) {
            orders.findOne({
                where:{
                    id:req.body.id
                }
            }).then(data=>{
                res.send({
                    message:`更新成功`,
                    code:200,
                    data
                })
            })
        }else{
            res.send({
                code:400,
                message:`更新失败`,
            })
        }
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 //更新品牌信息
 app.post("/brands/update",(req,res)=>{
    delete req.body.createdAt
    brands.
    update(req.body,{
        where:{
            id:req.body.id
        }
    }).then(f=>{
        if (f) {
            brands.findOne({
                where:{
                    id:req.body.id
                }
            }).then(data=>{
                res.send({
                    message:`更新成功`,
                    code:200,
                    data
                })
            })
        }else{
            res.send({
                code:400,
                message:`更新失败`,
            })
        }
    }).catch( err =>{
        res.send({
            code:500,
            message:`执行失败，错误信息:${err}`,
        })
    })
})

// --------------------------------------------------------------上传图片
//图片上传接口
app.post("/upload", (req, res) => {
    var form = new multiparty.Form({ uploadDir: `./uploads` });
    form.parse(req, (err, field, files) => {
      if (err) {
        res.send({
            message: `上传失败`,
            code: 400,
            data: err,
        });
      } else {
        // 01.创建一个接收对象的变量
        var updateObject = {};
        //02.遍历额外参数
        for (const index in field) {
          updateObject[index] = String(field[index]);
        }
        if (files.file != undefined) {
          fs.renameSync(
            files.file[0].path,
            `./uploads/${files.file[0].originalFilename}`
          ); // 文件重命名
          updateObject.url =
            baseUrl + "/uploads/" + files.file[0].originalFilename;
        }
        //03.
        res.send({
          message: `上传成功`,
          code: 200,
          data: updateObject,
        });
      }
    });
});
app.post("/upload/delete", (req, res) => {
    // 删除uploads下面的文件
      console.log('访问',req.body);
      res.send({
          code:200,
          message:'删除成功',
      })
      const filePath = path.join('./uploads',req.body); // 替换为你的文件路径
      fs.unlink(filePath, (err) => {
        if (err) {
            res.send({
              code:500,
              message:'文件已不存在',
            })
            console.error('删除文件时发生错误:', err);
            return
        } 
    });
  });



app.listen(9000,()=>{
    console.log('服务器已经启动');
})


